home *** CD-ROM | disk | FTP | other *** search
Text File | 1996-04-03 | 28.3 KB | 900 lines | [TEXT/MPS ] |
- //----------------------------------------------------------------------------------------
- // UOSAScript.cp
- // Copyright © 1988-96 by Apple Computer, Inc. All rights reserved.
- //----------------------------------------------------------------------------------------
-
- #ifndef __UOSASCRIPT__
- #include "UOSAScript.h"
- #endif
-
- // MacApp
-
- #ifndef __UCOMMANDHANDLER__
- #include "UCommandHandler.h"
- #endif
-
- #ifndef __UCOREGLOBALS__
- #include "UCoreGlobals.h"
- #endif
-
- #ifndef __UCOREUTILITIES__
- #include "UCoreUtilities.h"
- #endif
-
- #ifndef __UDISPATCHER__
- #include "UDispatcher.h"
- #endif
-
- #ifndef __UFAILURE__
- #include "UFailure.h"
- #endif
-
- #ifndef __UFILE__
- #include "UFile.h"
- #endif
-
- #ifndef __UMACAPPGLOBALS__
- #include "UMacAppGlobals.h"
- #endif
-
- // #ifndef __UMACAPPUTILITIES__
- // #include "UMacAppUtilities.h"
- // #endif
-
- #ifndef __USCRIPTING__
- #include "UScripting.h"
- #endif
-
- // Toolbox
-
- #ifndef __AEPACKOBJECT__
- #include <AEPackObject.h>
- #endif
-
- #ifndef __ASDEBUGGING__
- #include <ASDebugging.h>
- #endif
-
- #ifndef __ASREGISTRY__
- #include <ASRegistry.h>
- #endif
-
- #ifndef __OSAGeneric__
- #include <OSAGeneric.h>
- #endif
-
- #ifndef __RESOURCES__
- #include <Resources.h>
- #endif
-
- //----------------------------------------------------------------------------------------
- // Static Allocations
- //----------------------------------------------------------------------------------------
-
- ComponentInstance COSAScript::fgGenericScriptingComponent;
-
- COSAScript COSAScript::fgGlobalScript;
- COSAScript COSAScript::fgSharedScript;
- COSAScript COSAScript::fgEmptyScript;
-
- //========================================================================================
- // CLASS COSAScript
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // COSAScript::GetDefaultComponent:
- //----------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- ComponentInstance COSAScript::GetDefaultComponent()
- {
- if (HasAppleScript() && !fgGenericScriptingComponent)
- fgGenericScriptingComponent = OpenDefaultComponent(kOSAComponentType,
- kOSAGenericScriptingComponentSubtype);
-
- return fgGenericScriptingComponent;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::GetEmptyScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAApplicationRes
-
- COSAScript COSAScript::GetEmptyScript()
- {
- if (HasAppleScript() && (fgEmptyScript == kOSANullScript))
- {
- ComponentInstance defaultComponent = GetDefaultComponent();
- Handle scriptRes = MAGet1Resource('scpt', 128);
- FailNILResource(scriptRes);
- DetachResource(scriptRes);
- CTempDesc emptyScriptDesc('scpt', scriptRes);
- fgEmptyScript.SetScript(defaultComponent, emptyScriptDesc,
- kOSAModeCompileIntoContext, kOSAModeNull);
- }
- return fgEmptyScript;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::COSAScript
- //----------------------------------------------------------------------------------------
- #pragma segment ConstructorRes
-
- COSAScript::COSAScript()
- {
- fScriptID = kOSANullScript;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::COSAScript
- //----------------------------------------------------------------------------------------
- #pragma segment ConstructorRes
-
- COSAScript::COSAScript(OSAID theScript)
- {
- fScriptID = theScript;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::IsEmpty
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- Boolean COSAScript::IsEmpty()
- {
- return (fScriptID == kOSANullScript);
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::DisposeScript
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::DisposeScript(ComponentInstance theComponent)
- {
- OSAError err = noErr;
- if (!IsEmpty())
- {
- short saveRefNum = MACurResFile(); // preserve the current resource file
- err = OSADispose(theComponent, fScriptID);
- fScriptID = kOSANullScript;
- MAUseResFile(saveRefNum);
- }
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::Execute
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::Execute(ComponentInstance theComponent,
- OSAID theContext,
- long executeFlags,
- OSAID& theResult)
- {
- OSAError err = noErr;
- short saveRefNum = MACurResFile(); // preserve the current resource file
- err = OSAExecute(theComponent, fScriptID, theContext, executeFlags, &theResult);
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::GetScript
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::GetScript(ComponentInstance theComponent,
- DescType whichType,
- CAEDesc& scriptDesc,
- long storeFlags)
- {
- short saveRefNum = MACurResFile(); // getting the script may toss the resource chain
- OSAError err = noErr;
-
- // Check to see if they want a text version of the script
- if ((whichType == typeIntlText) || (whichType == typeChar))
- err = OSAGetSource(theComponent, fScriptID, whichType, scriptDesc);
- else
- err = OSAStore(theComponent, fScriptID, whichType, storeFlags, scriptDesc);
-
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::SetScript
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::SetScript(ComponentInstance theComponent,
- const CAEDesc& scriptDesc,
- long compileFlags,
- long loadFlags)
- {
- short saveRefNum = MACurResFile(); // setting the script may toss the resource chain
- OSAError err = noErr;
- FailInfo fi;
- Try(fi)
- {
- OSAID newScriptID = kOSANullScript;
- DescType scriptType = scriptDesc.GetDescriptorType();
- if (scriptType != typeNull)
- {
- if ((scriptType == typeIntlText) || (scriptType == typeChar))
- {
- if (scriptDesc.GetDataSize() != 0) // lets you empty out an objects script with ""
- FailOSAError(OSACompile(theComponent, scriptDesc, compileFlags, &newScriptID));
- }
- else if ((scriptType == typeFSS) || (scriptType == typeAlias))
- {
- TFile* scriptFile = NewFile('\?\?\?\?', '\?\?\?\?', kUsesDataFork, preferResourceFork, !kDataOpen, !kRsrcOpen);
- if (scriptType == typeAlias)
- scriptFile->SpecifyWithAlias((AliasHandle)scriptDesc.GetDataHandle());
- if (scriptType == typeFSS)
- {
- FSSpec theSpec = **(FSSpec**)scriptDesc.GetDataHandle();
- scriptFile->Specify(theSpec);
- }
- OSType fileType = '\?\?\?\?';
- FailOSErr(scriptFile->GetFileType(fileType));
- if (fileType == 'TEXT')
- {
- scriptFile->fUsesRsrcFork = noResourceFork;
- FailOSErr(scriptFile->OpenFile());
- long textSize = 0;
- FailOSErr(scriptFile->GetDataLength(textSize));
- Handle textHdl = NewHandle(textSize);
- FailNIL(textHdl);
- SignedByte wasState = LockHandle(textHdl);
- FailOSErr(scriptFile->ReadData(*textHdl, textSize));
- HSetState(textHdl, wasState);
- FailOSErr(scriptFile->CloseFile());
- CTempDesc textDesc(typeChar, textHdl);
- FailOSAError(OSACompile(theComponent, textDesc, compileFlags, &newScriptID));
- }
- else if (fileType == kOSAFileType)
- {
- scriptFile->fUsesDataFork = FALSE;
- scriptFile->fUsesRsrcFork = needResourceFork;
- FailOSErr(scriptFile->OpenFile());
- Handle scriptHdl = Get1Resource(kOSAScriptResourceType, 128);
- FailNILResource(scriptHdl);
- CAEDesc scriptRsrcDesc(typeOSAGenericStorage, scriptHdl);
- FailOSAError(OSALoad(theComponent, scriptRsrcDesc, loadFlags, &newScriptID));
- FailOSErr(scriptFile->CloseFile());
- }
- scriptFile = (TFile*)FreeIfObject(scriptFile);
- }
- else
- FailOSAError(OSALoad(theComponent, scriptDesc, loadFlags, &newScriptID));
- }
- if (!IsEmpty())
- FailOSErr(DisposeScript(theComponent));
- fScriptID = newScriptID;
- fi.Success();
- }
- else // Recover
- {
- err = fi.error;
- }
-
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::SetParentScript
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::SetParentScript(ComponentInstance genericComponent,
- OSAID itsParent)
- {
- OSAError err = noErr;
- short saveRefNum = MACurResFile(); // preserve the current resource file
- FailInfo fi;
- Try(fi)
- {
- if (!IsEmpty())
- {
- ComponentInstance exactComponent = NULL;
- CTempDesc parentProp;
- DescType parentCode = pASParent;
- FailOSErr(AECreateDesc(typeProperty, (Ptr)&parentCode, sizeof(parentCode), parentProp));
- OSAID myScriptID = fScriptID;
- OSAID parentScriptID = itsParent;
- if (itsParent == kOSANullScript)
- parentScriptID = GetEmptyScript();
- FailOSAError(OSAGenericToRealID(genericComponent, &myScriptID, &exactComponent));
- FailOSAError(OSAGenericToRealID(genericComponent, &parentScriptID, &exactComponent));
- FailOSAError(OSASetProperty(exactComponent, kOSAModeNull, myScriptID, parentProp, parentScriptID));
- }
- fi.Success();
- }
- else // Recover
- {
- err = fi.error;
- }
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::GetParentScript
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::GetParentScript(ComponentInstance genericComponent,
- OSAID& itsParent)
- {
- OSAError err = noErr;
- short saveRefNum = MACurResFile(); // preserve the current resource file
- FailInfo fi;
- Try(fi)
- {
- if (!IsEmpty())
- {
- CTempDesc parentProp;
- ComponentInstance exactComponent = NULL;
- DescType parentCode = pASParent;
- FailOSErr(AECreateDesc(typeProperty, (Ptr)&parentCode, sizeof(parentCode), parentProp));
- OSAID myScriptID = fScriptID;
- OSAID parentScriptID = fScriptID;
-
- if (genericComponent != exactComponent)
- {
- FailOSAError(OSAGenericToRealID(genericComponent, &myScriptID, &exactComponent));
- }
- FailOSAError(OSAGetProperty(exactComponent, kOSAModeNull, myScriptID, parentProp, &parentScriptID));
- if ((err == noErr) && (genericComponent != exactComponent))
- {
- FailOSAError(OSARealToGenericID(genericComponent, &parentScriptID, exactComponent));
- }
- itsParent = parentScriptID;
- }
- fi.Success();
- }
- else // Recover
- {
- err = fi.error;
- }
-
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScript::DoOSAEvent
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAError COSAScript::DoOSAEvent(ComponentInstance theComponent,
- TAppleEvent* message,
- TAppleEvent* reply,
- long modeFlags)
- {
- OSAError err = noErr;
- short saveRefNum = MACurResFile(); // preserve the current resource file
- err = OSADoEvent(theComponent, &message->fMessage, fScriptID, modeFlags, &reply->fMessage);
- MAUseResFile(saveRefNum);
- return err;
- }
-
- //========================================================================================
- // CLASS COSAScriptCntPtr
- //========================================================================================
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::COSAScriptCntPtr
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr::COSAScriptCntPtr() :
- fRep(NULL)
- {
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::~COSAScriptCntPtr
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr::~COSAScriptCntPtr()
- {
- DownCount();
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::COSAScriptCntPtr
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr::COSAScriptCntPtr(const COSAScriptCntPtr& other) :
- fRep(other.fRep)
- {
- UpCount();
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::COSAScriptCntPtr
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr::COSAScriptCntPtr(TOSAScriptRep* rep) :
- fRep(rep)
- {
- UpCount();
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::operator=
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr& COSAScriptCntPtr::operator=(const COSAScriptCntPtr& other)
- {
- SetRep(other.fRep);
- return *this;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::operator=
- //----------------------------------------------------------------------------------------
-
- COSAScriptCntPtr& COSAScriptCntPtr::operator=(TOSAScriptRep* rep)
- {
- SetRep(rep);
- return *this;
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::SetRep
- //----------------------------------------------------------------------------------------
-
- void COSAScriptCntPtr::SetRep(TOSAScriptRep* rep)
- {
- if (fRep != rep)
- {
- DownCount();
- fRep = rep;
- UpCount();
- }
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::UpCount
- //----------------------------------------------------------------------------------------
-
- void COSAScriptCntPtr::UpCount()
- {
- if (fRep)
- fRep->IncrementReferenceCount();
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::DownCount
- //----------------------------------------------------------------------------------------
-
- void COSAScriptCntPtr::DownCount()
- {
- if (fRep && !fRep->DecrementReferenceCount())
- delete fRep;
- // It is not necessary to set fRep to 0. To see why, see how DownCount is used above.
- // In all cases, fRep is either immediately reset, or the instance is being destroyed.
- // Note too that DownCount is private, so the usages above all all possible usages.
- }
-
- //----------------------------------------------------------------------------------------
- // COSAScriptCntPtr::NewOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- TOSAScriptRep* COSAScriptCntPtr::NewOSAScript()
- {
- MAVolatileInit(TOSAScriptRep*, script, new TOSAScriptRep);
- FailInfo fi;
- Try(fi)
- {
- script->IOSAScript();
- fi.Success();
- }
- else // Recover
- {
- script = (TOSAScriptRep*) FreeIfObject(script);
- fi.ReSignal();
- }
- return script;
- }
-
- //========================================================================================
- // CLASS TOSAScriptRep
- //========================================================================================
- #undef Inherited
- #define Inherited TObject
-
- #pragma segment MAScriptingRes
- MA_DEFINE_CLASS_M1(TOSAScriptRep, Inherited);
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep constructor
- //----------------------------------------------------------------------------------------
- #pragma segment ConstructorRes
-
- TOSAScriptRep::TOSAScriptRep()
- : fScript(kOSANullScript),
- fNextScriptIdle(0),
- fCompileFlags(kOSAModeCompileIntoContext),
- fLoadFlags(kOSAModeNull),
- fStoreFlags(kOSAModeDontStoreParent),
- fExecuteFlags(kOSAModeNull),
- fDoEventFlags(kOSAModeNull),
- fRefCount(0)
- {
- fScriptingComponent = COSAScript::GetDefaultComponent();
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep destructor
- //----------------------------------------------------------------------------------------
- #pragma segment MADestructorRes
-
- TOSAScriptRep::~TOSAScriptRep()
- {
- FreeOSAScript();
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::IOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOpen
-
- void TOSAScriptRep::IOSAScript()
- {
- IObject();
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::HasOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- Boolean TOSAScriptRep::HasOSAScript()
- {
- return HasAppleScript() && (!fScript.IsEmpty());
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::FreeOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::FreeOSAScript()
- {
- if (this->HasOSAScript())
- FailOSAError(fScript.DisposeScript(fScriptingComponent));
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::SetOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::SetOSAScript(const CAEDesc& scriptDesc)
- {
- if (HasAppleScript())
- {
- this->FreeOSAScript(); // dispose the current script
- FailOSAError(fScript.SetScript(fScriptingComponent, scriptDesc, fCompileFlags, fLoadFlags));
- OSAID parentScript = GetOSAParent();
- fScript.SetParentScript(fScriptingComponent, parentScript);
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::GetOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::GetOSAScript(CAEDesc& scriptDesc,
- const CAEDesc& desiredType)
- {
- if (HasAppleScript())
- {
- if (this->HasOSAScript())
- {
- DescType whichType = typeOSAGenericStorage;
- if (desiredType.GetDescriptorType() == typeType)
- whichType = desiredType.GetType();
- FailOSAError(fScript.GetScript(fScriptingComponent, whichType, scriptDesc, fStoreFlags));
- }
- }
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::ExecuteOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- OSAID TOSAScriptRep::ExecuteOSAScript()
- {
- OSAID resultScript = kOSANullScript;
- if (HasOSAScript())
- FailOSAError(fScript.Execute(fScriptingComponent, kOSANullScript, fExecuteFlags, resultScript));
-
- return resultScript;
- }
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::HandleOSAEvent:
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- Boolean TOSAScriptRep::HandleOSAEvent(CommandNumber /*aCommandNumber*/,
- TAppleEvent* message,
- TAppleEvent* reply)
- {
- Boolean handled = FALSE;
- if (HasAppleScript())
- {
- OSErr err = errAEEventNotHandled;
- COSAScript globalScript = COSAScript::GetGlobalScript();
- COSAScript parentScript = GetOSAParent();
- Boolean hasParentScript = !(parentScript == kOSANullScript);
- Boolean hasLocalScript = HasOSAScript();
- Boolean useGlobalScript = !(globalScript == kOSANullScript) &&
- (hasLocalScript || hasParentScript);
-
- if (useGlobalScript || hasLocalScript || hasParentScript)
- {
- long refCon = 0; // passed by address
- AEEventHandlerUPP currProc = NULL; // passed by address
-
- FailInfo fi;
- Try(fi)
- {
- FailOSAError(OSAGetResumeDispatchProc(fScriptingComponent, &currProc, &refCon));
- FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, (AEEventHandlerUPP)kOSAUseStandardDispatch, kOSADontUsePhac));
-
- if (useGlobalScript)
- {
- if (hasLocalScript)
- globalScript.SetParentScript(fScriptingComponent, fScript);
- else if (hasParentScript)
- globalScript.SetParentScript(fScriptingComponent, parentScript);
- err = globalScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
- }
- else if (hasLocalScript)
- {
- err = fScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
- }
- else if (hasParentScript)
- {
- err = parentScript.DoOSAEvent(fScriptingComponent, message, reply, fDoEventFlags);
- }
- handled = (err == noErr);
- FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, currProc, refCon));
- fi.Success();
- }
- else // Recover
- {
- FailOSAError(OSASetResumeDispatchProc(fScriptingComponent, currProc, refCon));
- fi.ReSignal();
- }
-
- }
- }
- return handled;
- } // TOSAScriptRep::HandleOSAEvent
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::ReadOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::ReadOSAScript(TStream* aStream)
- {
- CTempDesc theScriptDesc;
- theScriptDesc.ReadFrom(aStream);
- SetOSAScript(theScriptDesc);
- } // TOSAScriptRep::ReadOSAScript
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::ReadOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::ReadOSAScript( TFile* aFile,
- ResType resourceType,
- short resourceID)
- {
- CTempDesc theScriptDesc;
-
- theScriptDesc.ReadFrom(aFile, resourceType, resourceID);
- this->SetOSAScript(theScriptDesc);
- } // TOSAScriptRep::ReadOSAScript:
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::WriteOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::WriteOSAScript( TStream* aStream,
- DescType asType)
- {
- CTempDesc theScriptDesc;
- CTempDesc theTypeDesc;
- theTypeDesc.PutType(asType);
- GetOSAScript(theScriptDesc, theTypeDesc);
- theScriptDesc.WriteTo(aStream);
- } // TOSAScriptRep::WriteOSAScript
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::WriteOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAOSLDispatch
-
- void TOSAScriptRep::WriteOSAScript( TFile* aFile,
- DescType asType,
- short resourceID,
- CStr255& resourceName)
- {
- CTempDesc scriptDesc;
- CTempDesc typeDesc;
-
- typeDesc.PutType(asType);
- this->GetOSAScript(scriptDesc, typeDesc);
- scriptDesc.WriteTo(aFile, resourceID, resourceName);
- } // TOSAScriptRep::WriteOSAScript
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::GetOSAParent:
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- OSAID TOSAScriptRep::GetOSAParent()
- {
- return COSAScript::GetSharedScript();
- } // TOSAScriptRep::GetOSAParent
-
- //----------------------------------------------------------------------------------------
- // TOSAScriptRep::IdleOSAScript:
- //----------------------------------------------------------------------------------------
- #pragma segment MAScriptingRes
-
- void TOSAScriptRep::IdleOSAScript()
- {
- // Gives an attached script idle time so its idle event handler can do some work.
- if (HasAppleScript() && (fNextScriptIdle != kMaxIdleTime) && (TickCount() > fNextScriptIdle))
- {
- CAEDesc myAddress;
- MAVolatileInit(TAppleEvent*, message, NULL);
- MAVolatileInit(TAppleEvent*, reply, NULL);
- MAVolatileInit(TClientCommand*, theCmd, NULL);
-
- FailInfo idleFail;
- Try(idleFail)
- {
- message = new TAppleEvent;
- message->IAppleEvent('misc', 'idle', (AEAddressDesc &)myAddress, kAEWaitReply);
-
- reply = new TAppleEvent;
- reply->IAppleEvent('misc', 'idle', (AEAddressDesc &)myAddress, kAENoReply);
-
- fNextScriptIdle = TickCount() + 3600; // Default to one minute in case the idle proc doesn't return anything
- FailInfo fi;
- Try(fi)
- {
- if (HandleOSAEvent(0, message, reply) && reply->HasParameter(keyAEResult))
- {
- unsigned long idleSeconds = reply->ReadLong(keyAEResult);
- fNextScriptIdle = TickCount() + (idleSeconds * 60);
- }
- fi.Success();
- }
- else // Recover
- {
- // fall through without resignalling
- }
-
- theCmd = new TClientCommand;
- theCmd->IClientCommand(0, NULL, FALSE, FALSE, NULL, message);
- theCmd->ProcessReply(reply);
-
- idleFail.Success();
- }
- else // Recover
- {
- // fall through without resignalling
- }
-
- if (theCmd)
- FreeIfObject(theCmd);
- else
- { // Freeing the command will free the message and reply
- FreeIfObject(message);
- FreeIfObject(reply);
- }
- }
- } // TOSAScriptRep::IdleOSAScript
-
- //========================================================================================
- // CLASS TExecuteScriptCommand
- //========================================================================================
- #undef Inherited
- #define Inherited TCommand
-
- #pragma segment MACommandNonRes
- MA_DEFINE_CLASS_M1(TExecuteScriptCommand, Inherited);
-
- //----------------------------------------------------------------------------------------
- // TExecuteScriptCommand constructor
- //----------------------------------------------------------------------------------------
- #pragma segment MACommandRes
-
- TExecuteScriptCommand::TExecuteScriptCommand()
- {
- fDisposeScript = FALSE;
- fComponent = NULL;
- fExecuteFlags = kOSAModeNull;
- } // TExecuteScriptCommand::TExecuteScriptCommand
-
- //----------------------------------------------------------------------------------------
- // TExecuteScriptCommand::IExecuteScriptCommand:
- //----------------------------------------------------------------------------------------
- #pragma segment MACommandRes
-
- void TExecuteScriptCommand::IExecuteScriptCommand(CommandNumber itsCommandNumber,
- TCommandHandler* itsContext,
- Boolean canUndo,
- Boolean causesChange,
- TObject* objectToNotify,
- OSAID scriptToExecute,
- OSAID theScriptContext,
- long executeFlags,
- Boolean disposeOfScript,
- ComponentInstance whichComponent)
- {
- this->ICommand(itsCommandNumber, itsContext, canUndo, causesChange, objectToNotify);
- fScript = scriptToExecute;
- fDisposeScript = disposeOfScript;
- fComponent = whichComponent;
- fScriptContext = theScriptContext;
- fExecuteFlags = executeFlags;
- } // TExecuteScriptCommand::IExecuteScriptCommand
-
- //----------------------------------------------------------------------------------------
- // TExecuteScriptCommand::DoIt:
- //----------------------------------------------------------------------------------------
- #pragma segment MADoCommand
-
- void TExecuteScriptCommand::DoIt() // override
- {
- COSAScript theScript(fScript);
- OSAID aResult;
- if (theScript != kOSANullScript)
- {
- // Run it through the globals script if there is one
- COSAScript globalsScript = COSAScript::GetGlobalScript();
- if (globalsScript != kOSANullScript)
- {
- globalsScript.SetParentScript(fComponent, theScript);
- globalsScript.Execute(fComponent, fScriptContext, fExecuteFlags, aResult);
- }
- else
- theScript.Execute(fComponent, fScriptContext, fExecuteFlags, aResult);
- }
- } // TExecuteScriptCommand::DoIt
-
- //----------------------------------------------------------------------------------------
- // TExecuteScriptCommand::Free:
- //----------------------------------------------------------------------------------------
- #pragma segment MADoCommand
-
- TExecuteScriptCommand::~TExecuteScriptCommand()
- {
- if (fDisposeScript)
- fScript.DisposeScript(fComponent);
- } // TExecuteScriptCommand::Free
-
- //----------------------------------------------------------------------------------------
- // End of UOSAScript.cp
-
- #pragma segment Inline
-